"""
加密工具
创建时间：2025-09-12
作者：开发团队
目的：提供AES加密解密、密钥生成等加密相关功能
"""

from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.backends import default_backend
import base64
import os
from ..core.config import get_config

# 获取配置
config = get_config()


def generate_key() -> bytes:
    """
    生成新的加密密钥
    :return: 加密密钥
    """
    return Fernet.generate_key()


def generate_key_from_password(password: str, salt: bytes | None = None) -> tuple[bytes, bytes]:
    """
    从密码生成加密密钥
    :param password: 密码
    :param salt: 盐值，如果为None则自动生成
    :return: (密钥, 盐值)
    """
    if salt is None:
        salt = os.urandom(16)
    
    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256(),
        length=32,
        salt=salt,
        iterations=100000,
        backend=default_backend()
    )
    key = base64.urlsafe_b64encode(kdf.derive(password.encode()))
    return key, salt


def encrypt_data(data: str, key: bytes) -> str:
    """
    使用密钥加密数据
    :param data: 要加密的数据
    :param key: 加密密钥
    :return: 加密后的数据(base64编码)
    """
    f = Fernet(key)
    encrypted_data = f.encrypt(data.encode())
    return base64.urlsafe_b64encode(encrypted_data).decode()


def decrypt_data(encrypted_data: str, key: bytes) -> str:
    """
    使用密钥解密数据
    :param encrypted_data: 加密的数据(base64编码)
    :param key: 解密密钥
    :return: 解密后的数据
    """
    f = Fernet(key)
    decoded_data = base64.urlsafe_b64decode(encrypted_data.encode())
    decrypted_data = f.decrypt(decoded_data)
    return decrypted_data.decode()


def hash_data(data: str) -> str:
    """
    对数据进行哈希计算
    :param data: 要哈希的数据
    :return: 哈希值
    """
    from hashlib import sha256
    return sha256(data.encode()).hexdigest()


def verify_hash(data: str, hash_value: str) -> bool:
    """
    验证数据的哈希值
    :param data: 原始数据
    :param hash_value: 哈希值
    :return: 是否匹配
    """
    return hash_data(data) == hash_value